package binarytree

func findModeSelf(root *TreeNode) []int {
	// 考虑二叉搜索树的特点
	// 按照中序遍历则是有顺序的，所以我们使用 prev+cur 指针来比较是否是相等即可
	// 使用result记录存储的节点
	// 使用maxCount计算曾经的最大相等元素的数量
	// 使用count计算当前相等元素的数量，当prev!=cur的时候就要判断count和maxCount了
	// 如果count>maxCount，把result中存储的之前的节点都干掉，存储进入 prev 指向的节点的值，
	// 如果count==maxCount, 把prev也塞进去

	count := 0
	maxCount := 0
	result := []int{}
	var inorder func(node *TreeNode)
	var prev *TreeNode
	inorder = func(node *TreeNode) {
		if node == nil {
			return
		}
		// 用中序遍历的方法进行节点的遍历
		inorder(node.Left)
		if prev == nil {
			count = 1 // 初始化
		} else {
			if node.Val == prev.Val { // 处理当前节点
				count++
			} else {
				// 中断了count的连续性，开始进行数量的判断
				if count > maxCount {
					result = []int{prev.Val}
					maxCount = count
				} else if count == maxCount {
					result = append(result, prev.Val)
				}
				count = 1 // 复位
			}
		}
		prev = node

		inorder(node.Right)
	}

	inorder(root)
	// 以上处理方法，遗漏了最后一个节点（跟节点）遍历之后的判断，在此处补上
	if count > maxCount {
		result = []int{prev.Val}
	} else if count == maxCount {
		result = append(result, prev.Val)
	}
	return result
}
